home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 May / PCpro_2006_05.ISO / files / mobile / fma-2.0-stable-setup.exe / {app} / source / uNewMessage.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2004-07-07  |  11.3 KB  |  409 lines

  1. unit uNewMessage;
  2.  
  3. {
  4. *******************************************************************************
  5. * Descriptions: Incoming Message Pop-up Implementation
  6. * $Source: /cvsroot/fma/fma/uNewMessage.pas,v $
  7. * $Locker:  $
  8. *
  9. * Todo:
  10. *
  11. * Change Log:
  12. * $Log: uNewMessage.pas,v $
  13. * Revision 1.16  2004/07/07 11:21:40  z_stoichev
  14. * Fixed minimum message height.
  15. * Personalization always used.
  16. *
  17. * Revision 1.15  2004/07/06 14:43:17  z_stoichev
  18. * - Added Personalization default contact image.
  19. * - Added Open Chat menu command
  20. *
  21. * Revision 1.14  2004/06/29 12:37:07  z_stoichev
  22. * New message window renamed
  23. *
  24. * Revision 1.13  2004/06/29 10:46:34  z_stoichev
  25. * Updated personalization
  26. *
  27. * Revision 1.12  2004/06/28 22:43:04  z_stoichev
  28. * Personalization support added.
  29. *
  30. * Revision 1.11  2004/06/23 13:49:27  z_stoichev
  31. * Fixed Delete from Archive
  32. *
  33. * Revision 1.10  2004/06/21 09:45:28  z_stoichev
  34. * Fixed Rply focus issue.
  35. * Popup menu changed.
  36. *
  37. * Revision 1.9  2004/04/01 15:06:21  z_stoichev
  38. * Mark as read on reply/forward
  39. * popup menu moved
  40. *
  41. * Revision 1.8  2004/01/12 15:36:05  z_stoichev
  42. * Fixed too small width issue.
  43. *
  44. * Revision 1.7  2003/11/28 09:38:07  z_stoichev
  45. * Merged with branch-release-1-1 (Fma 0.10.28c)
  46. *
  47. * Revision 1.6.2.4  2003/11/21 14:00:23  z_stoichev
  48. * Message fade out stopped on mouse over text or when
  49. * window is activated.
  50. * Actions as delete, reply, etc. moved into Popup menu.
  51. * Added Add contact action for unknown senders.
  52. * Window shows inactivated in order do not steal focus.
  53. *
  54. * Revision 1.6.2.3  2003/11/11 18:09:22  z_stoichev
  55. * Add background.
  56. * Auto form resize.
  57. * Add some buttons.
  58. *
  59. * Revision 1.6.2.2  2003/11/10 14:03:09  z_stoichev
  60. * RC3
  61. *
  62. * Revision 1.6.2.1  2003/10/27 07:22:54  z_stoichev
  63. * Build 0.1.0 RC1 Initial Checkin.
  64. *
  65. * Revision 1.6  2003/10/14 09:23:47  z_stoichev
  66. * Unit SentSMS renamed to uComposeSMS.
  67. *
  68. * Revision 1.5  2003/10/14 09:14:44  z_stoichev
  69. * Method Create renamed to CreateMsg in order
  70. * to avoid hiding of virtual inherited method.
  71. *
  72. * Revision 1.4  2003/01/30 04:15:57  warren00
  73. * Updated with header comments
  74. *
  75. *
  76. *******************************************************************************
  77. }
  78.  
  79. interface
  80.  
  81. uses
  82.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  83.   Dialogs, StdCtrls, Placemnt, ExtCtrls, TntStdCtrls, jpeg, Menus,
  84.   GR32_Image;
  85.  
  86. type
  87.   TfrmNewMessage = class(TForm)
  88.     FormPlacement1: TFormPlacement;
  89.     Timer1: TTimer;
  90.     lbText: TTntLabel;
  91.     lbAlpha: TTntLabel;
  92.     Image1: TImage;
  93.     OkButton: TButton;
  94.     ActionButton: TTntButton;
  95.     PopupMenu1: TPopupMenu;
  96.     Reply1: TMenuItem;
  97.     Forward1: TMenuItem;
  98.     N1: TMenuItem;
  99.     Delete1: TMenuItem;
  100.     N2: TMenuItem;
  101.     AddContact1: TMenuItem;
  102.     ImagePanel: TPanel;
  103.     Image32: TImage32;
  104.     Chat1: TMenuItem;
  105.     procedure Timer1Timer(Sender: TObject);
  106.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  107.     procedure Reply1Click(Sender: TObject);
  108.     procedure FormCreate(Sender: TObject);
  109.     procedure OkButtonClick(Sender: TObject);
  110.     procedure ActionButtonClick(Sender: TObject);
  111.     procedure Forward1Click(Sender: TObject);
  112.     procedure PopupMenu1Popup(Sender: TObject);
  113.     procedure Delete1Click(Sender: TObject);
  114.     procedure OnMouseEnter(Sender: TObject);
  115.     procedure OnMouseLeave(Sender: TObject);
  116.     procedure FormDeactivate(Sender: TObject);
  117.     procedure AddContact1Click(Sender: TObject);
  118.     procedure Chat1Click(Sender: TObject);
  119.     procedure FormShow(Sender: TObject);
  120.   private
  121.     { Private declarations }
  122.     FAlphaCount: integer;
  123.     FPrevAlpha: boolean;
  124.     FPersonalized: Boolean;
  125.     FCustomImage: Boolean;
  126.     procedure DoPersonalize;
  127.     procedure DoMarkMsgAsRead;
  128.     procedure Set_CustomImage(const Value: Boolean);
  129.   public
  130.     { Public declarations }
  131.     msgInInbox: boolean;
  132.     msgLocation,msgPdu: String;
  133.     msgIndex: Integer;
  134.     constructor CreateMsg(Sender, text: WideString; AlphaBlend: Integer);
  135.     property IsPersonalized: Boolean read FPersonalized;
  136.     property IsCustomImage: Boolean read FCustomImage write Set_CustomImage;
  137.   end;
  138.  
  139. var
  140.   frmNewMessage: TfrmNewMessage;
  141.  
  142. implementation
  143.  
  144. uses Unit1, uComposeSMS, uSyncPhonebook, uMissedCalls, uChatSMS, gsm_sms;
  145.  
  146. {$R *.dfm}
  147.  
  148. const
  149.   DontFadeSeconds = 5;
  150.  
  151. constructor TfrmNewMessage.CreateMsg(Sender, text: WideString; AlphaBlend: Integer);
  152. var
  153.   wide,high: integer;
  154. begin
  155.   inherited Create(nil);
  156.   msgLocation := '';
  157.   msgPdu := '';
  158.   msgIndex := -1;
  159.   msgInInbox := True;
  160.   { Prepare fade out }
  161.   AlphaBlendValue := AlphaBlend;
  162.   FAlphaCount := AlphaBlend + DontFadeSeconds*10; // dont fade immediately
  163.   lbAlpha.Alignment := taLeftJustify;
  164.   lbAlpha.AutoSize := True;
  165.   lbAlpha.Caption := Sender;
  166.   lbText.Anchors := [akLeft,akTop];
  167.   lbText.Caption := '';
  168.   { Restore form position }
  169.   FormPlacement1.RestoreFormPlacement;
  170.   Application.ProcessMessages;
  171.   Constraints.MinHeight := 32;
  172.   ClientHeight := 137;
  173.   { Resize form to fit message }
  174.   lbText.WordWrap := False;
  175.   lbText.AutoSize := True;
  176.   lbText.Caption := text;
  177.   lbText.WordWrap := True;
  178.   wide := lbText.Width;
  179.   if lbAlpha.Width > wide then wide := lbAlpha.Width;
  180.   wide := wide + lbAlpha.Left - 4;
  181.   if wide > (Constraints.MaxWidth-16) then begin
  182.     Width := Constraints.MaxWidth;
  183.     lbText.AutoSize := False;
  184.     lbText.Width := Constraints.MaxWidth - lbText.Left - 16;
  185.     lbText.AutoSize := True;
  186.   end
  187.   else begin
  188.     if wide > (Constraints.MinWidth-16) then
  189.       ClientWidth := wide + 8
  190.     else
  191.       Width := Constraints.MinWidth;
  192.   end;
  193.   high := lbText.Height - 85;
  194.   if high > 0 then
  195.     ClientHeight := ClientHeight + high;
  196.   Constraints.MinHeight := Height;  
  197.   { Fix buttons top }
  198.   OkButton.Top := ClientHeight-25;
  199.   ActionButton.Top := OkButton.Top;
  200.   { Stick text }
  201.   lbText.AutoSize := False;
  202.   lbText.Height := OkButton.Top - lbText.Top - 4;
  203.   lbText.Anchors := [akLeft,akTop,akRight,akBottom];
  204.   { Personalize }
  205.   FPersonalized := False;
  206.   DoPersonalize;
  207.   { Show window but not activate it }
  208.   SetWindowPos(Handle, HWND_TOPMOST,
  209.     Top, Left, Width, Height,
  210.     SWP_NOACTIVATE);
  211.   ShowWindow(Handle,SW_SHOWNOACTIVATE);
  212.   ShowWindow(OkButton.Handle,SW_SHOWNOACTIVATE);
  213.   ShowWindow(ActionButton.Handle,SW_SHOWNOACTIVATE);
  214.   ShowWindow(ImagePanel.Handle,SW_SHOWNOACTIVATE);
  215.   ShowWindow(Image32.Handle,SW_SHOWNOACTIVATE);
  216.   {
  217.   Show;
  218.   {}
  219. end;
  220.  
  221. procedure TfrmNewMessage.Timer1Timer(Sender: TObject);
  222. begin
  223.   FAlphaCount := FAlphaCount - 1;
  224.   if FAlphaCount < AlphaBlendValue then begin
  225.     AlphaBlendValue := AlphaBlendValue - 2;
  226.     if AlphaBlendValue < 10 then
  227.       OkButton.Click;
  228.   end;
  229. end;
  230.  
  231. procedure TfrmNewMessage.FormClose(Sender: TObject;
  232.   var Action: TCloseAction);
  233. begin
  234.   Action := caFree;
  235. end;
  236.  
  237. procedure TfrmNewMessage.FormCreate(Sender: TObject);
  238. begin
  239.   lbAlpha.Font.Style := lbAlpha.Font.Style + [fsBold];
  240.   Image1.Picture.Assign(Form1.CommonBitmaps.Bitmap[1]);
  241. end;
  242.  
  243. procedure TfrmNewMessage.OkButtonClick(Sender: TObject);
  244. begin
  245.   Timer1.Enabled := False;
  246.   Close;
  247. end;
  248.  
  249. procedure TfrmNewMessage.ActionButtonClick(Sender: TObject);
  250. var
  251.   p: TPoint;
  252. begin
  253.   with (Sender as TButton) do
  254.     p := ClientToScreen(Point(0,Height));
  255.   PopupMenu1.Popup(p.X,p.Y);  
  256. end;
  257.  
  258. procedure TfrmNewMessage.PopupMenu1Popup(Sender: TObject);
  259. begin
  260.   Delete1.Enabled := (msgIndex <> -1) and (msgLocation <> '') and (msgPdu <> '');
  261.   Chat1.Enabled := lbAlpha.Caption <> sUnknownNumber;
  262.   { TODO: check for sUknownContact }
  263.   AddContact1.Enabled := Chat1.Enabled and (Pos('[',lbAlpha.Caption) = 0); // no name included so unknown contact 
  264. end;
  265.  
  266. procedure TfrmNewMessage.Reply1Click(Sender: TObject);
  267. begin
  268.   DoMarkMsgAsRead;
  269.   frmMessageContact.Clear;
  270.   Form1.ActionSMSNewMsg.Execute;
  271.   frmMessageContact.AddRecipient(lbAlpha.Caption);
  272.   frmMessageContact.Memo.SetFocus;
  273. end;
  274.  
  275. procedure TfrmNewMessage.Forward1Click(Sender: TObject);
  276. begin
  277.   DoMarkMsgAsRead;
  278.   frmMessageContact.Clear;
  279.   Form1.ActionSMSNewMsg.Execute;
  280.   frmMessageContact.Memo.Text := lbText.Caption;
  281.   frmMessageContact.Memo.SelStart := Length(lbText.Caption);
  282. end;
  283.  
  284. procedure TfrmNewMessage.Delete1Click(Sender: TObject);
  285. begin
  286.   DoMarkMsgAsRead;
  287.   if not msgInInbox and Form1.IsMoveToArchiveEnabled then begin
  288.     { message is already deleted from phone }
  289.     Form1.DelMsgFromFolder(Form1.FNodeMsgArchive,msgPdu);
  290.     OkButton.Click;
  291.   end
  292.   else
  293.     if Form1.DeleteSMS(msgIndex,msgLocation) then begin
  294.       Form1.DelMsgFromFolder(Form1.FNodeMsgInbox,msgPdu);
  295.       OkButton.Click;
  296.     end;
  297. end;
  298.  
  299. procedure TfrmNewMessage.AddContact1Click(Sender: TObject);
  300. begin
  301.   { now lbAlpha.Caption comtains the number only }
  302.   Form1.frmSyncPhonebook.DoEdit(True,lbAlpha.Caption);
  303. end;
  304.  
  305. procedure TfrmNewMessage.OnMouseEnter(Sender: TObject);
  306. begin
  307.   FPrevAlpha := AlphaBlend;
  308.   AlphaBlend := False;
  309.   Timer1.Enabled := False;
  310. end;
  311.  
  312. procedure TfrmNewMessage.OnMouseLeave(Sender: TObject);
  313. begin
  314.   if FPrevAlpha then
  315.     FormDeactivate(nil);
  316. end;
  317.  
  318. procedure TfrmNewMessage.FormDeactivate(Sender: TObject);
  319. begin
  320.   { Was fade out started when we enter ? }
  321.   if FAlphaCount = AlphaBlendValue then begin
  322.     { Yes, fade out faster now }
  323.     Timer1.Interval := 5;
  324.     FAlphaCount := 250;
  325.     AlphaBlendValue := 250;
  326.   end; { No, just continue }
  327.   AlphaBlend := True;
  328.   Timer1.Enabled := True;
  329. end;
  330.  
  331. procedure TfrmNewMessage.DoMarkMsgAsRead;
  332. begin
  333.   { Mark as read }
  334.   if not msgInInbox and Form1.IsMoveToArchiveEnabled then
  335.     Form1.UpdateNewMessagesCounter(Form1.FNodeMsgArchive,msgPdu)
  336.   else
  337.     Form1.UpdateNewMessagesCounter(Form1.FNodeMsgInbox,msgPdu);
  338. end;
  339.  
  340. procedure TfrmNewMessage.DoPersonalize;
  341. var
  342.   contact: PContactData;
  343.   w: WideString;
  344.   s: string;
  345. begin
  346.   { Try to lookup caller and load personalized info about the contact }
  347.   if not FPersonalized then begin
  348.     FPersonalized := True;
  349.     w := Form1.ExtractContact(lbAlpha.Caption);
  350.     if form1.frmSyncPhonebook.FindContact(w,contact) then begin
  351.       try
  352.         s := GetContactPictureFile(contact);
  353.         if s <> '' then begin
  354.           Image32.Bitmap.LoadFromFile(s);
  355.           IsCustomImage := True;
  356.           ImagePanel.Visible := True;
  357.         end
  358.         else
  359.           IsCustomImage := False;
  360.       except
  361.         IsCustomImage := False;
  362.       end;
  363.     end
  364.     else
  365.       IsCustomImage := False;
  366.   end;
  367. end;
  368.  
  369. procedure TfrmNewMessage.Set_CustomImage(const Value: Boolean);
  370. begin
  371.   FCustomImage := Value;
  372.   if not Value then
  373.     Image32.Bitmap.Assign(Form1.CommonBitmaps.Bitmap[0]);
  374. end;
  375.  
  376. procedure TfrmNewMessage.Chat1Click(Sender: TObject);
  377. var
  378.   Chat: TfrmCharMessage;
  379.   sms: TSMS;
  380.   dt: TDateTime;
  381. begin
  382.   Chat := Form1.GetChatWindow(Form1.ExtractNumber(lbAlpha.Caption),True);
  383.   Chat.Show;
  384.   Chat.BringToFront;
  385.   Chat.Memo.SetFocus;
  386.   { Start new chat session, add current message as first one }
  387.   sms := TSMS.Create;
  388.   try
  389.     sms.PDU := msgPdu;
  390.     dt := sms.TimeStamp;
  391.     { if not timestamp is not set (i.e. outgoing sms) use current time }
  392.     if dt = 0 then dt := Now;
  393.     Chat.AddChatText(lbAlpha.Caption,lbText.Caption,dt);
  394.     DoMarkMsgAsRead;
  395.   finally
  396.     sms.Free;
  397.   end;
  398.   Close;
  399. end;
  400.  
  401. procedure TfrmNewMessage.FormShow(Sender: TObject);
  402. begin
  403.   SetWindowPos(Handle, HWND_TOPMOST,
  404.     Top, Left, Width, Height,
  405.     SWP_NOACTIVATE);
  406. end;
  407.  
  408. end.
  409.